onkeydown v dbgridu, kdyz je editovano..

Otázka od: Jan Rizek

31. 5. 2004 9:47

Problem obsluhy klaves pri editovani v gridu:

potreboval bych zadelat do komponenty dbgrid (jejiho potomka) obsluhu
stisknute klavesy. Pri rozeditovani policka gridu ovsem program do KeyDown;
(override) dbgridu vubec nedojde - obslouzi se jen na urovni TWinControl.

Message vm_keydown se vubec neodchyti - grid se sklada z MaskEditu?? a pri
editaci jsme v jenom z nich?? Je to tak?

Vyresili jsme to obsluhou z formulare - KeyPrewiew:=true a na onKeyDown
zavolam metodu naseho DBGridu.
Je to ale trochu pres ruku. Nelze to nejak vyresit na urovni komponenty?

Nemate s tim nejake zkusenosti?

Co s tim?

  JR


Odpovedá: Marek Dostal

31. 5. 2004 10:31

> potreboval bych zadelat do komponenty dbgrid (jejiho potomka) obsluhu
> stisknute klavesy. Pri rozeditovani policka gridu ovsem program do
KeyDown;
> (override) dbgridu vubec nedojde - obslouzi se jen na urovni TWinControl.
>
> Message vm_keydown se vubec neodchyti - grid se sklada z MaskEditu?? a pri
> editaci jsme v jenom z nich?? Je to tak?

DBGrid si pri editaci vytvari interne InplaceEditor (viz Grids.pas).

V potomkovi DBGrid chytam klavesy bud
1) predefinovanemi metody KeyDown:

procedure TMyGrid.KeyDown(var Key: Word; Shift: TShiftState);
begin
   if key=vk_escape then neco ;
   if key=vk_f1 then neco;
   inherited KeyDown(Key,Shift);
end;


2) interne si priradim do udalosti OnKeyDown mou proceduru MyOnKeyDown:

constructor TMyGrid.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  OnKeyDown:=MyOnKeyDown;
end;

procedure TMyGrid.MyOnKeyDown(Sender: TObject; var Key: Word; Shift:
TShiftState);
begin
   if (Key=vk_F1) and (Shift=[]) then neco;
   if (key=vk_f2) and and (Shift=[]) then neco;
end;


3) a navic si v predefinovane metode KeyPress chytam oddelovace tisicu, tak
aby bylo jedno zda se stiskne tecka nebo carka, obdobne pro datum:


procedure TAgniGrid.KeyPress(var Key: Char);
begin
   if pole.DataType in [ftFloat,ftBCD,ftFMTBcd] then
   begin
      if Key in ['.',','] then Key:=DecimalSeparator;
   end else
   if pole.DataType in [ftDate,ftDateTime] then
   begin
      if Key in ['.',','] then Key:=DateSeparator;
   end;
   inherited KeyPress(Key);
end;


   Marek Dostal
   D7Prof, WinXP Home, FireBird 1.0.2